Paylaşılan bir veri erişim katmanına LINQKit'u dahil etmeye çalışıyorum, ancak bir roadblocka çarptım. İç içe bir sorguyu ExpandableQuery
kullanarak oluştururken, ifade ayrıştırıcısı ExpandableQuery
'u doğru bir şekilde açamaz ve geçerli bir SQL sorgusu oluşturamaz. Atılan hata:LINQKit: LINQ içinde bir GenişletilebilirQuery öğelerini varlıklar
System.NotSupportedException: 'Store' türünde sabit bir değer oluşturulamıyor. Bu bağlamda yalnızca ilkel türler veya numaralandırma türleri desteklenir. Aşağıdaki örnek program ile, bu sorunu kolayca yeniden oluşturabiliriz ve tablodaki AsExpandable()
çağrısıyla açıkça izole edilebilir. Eğer AsExpandable()
çağrıyı kaldırmak
class Program
{
static void Main(string[] args)
{
Database.SetInitializer<MyContext>(null);
var cs = MY_CONNECTION_STRING;
var context = new MyContext(cs);
var table = (IQueryable<Store>)context.Set<Store>();
var q = table
.AsExpandable()
.Select(t => new {Id = t.StoreId, less = table.Where(tt => tt.StoreId > t.StoreId) })
.Take(1)
.ToArray();
}
}
public class MyContext : DbContext
{
public MyContext(string connection) : base(connection) {}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Store>();
base.OnModelCreating(modelBuilder);
}
}
[Table("stores")]
public class Store
{
[Key]
public int StoreId { get; set; }
}
, oluşturulan SQL sen üçgen gerçekleştirmek için ne beklenir katılmak: Eğer
AsExpandable()
eklediğinizde
SELECT
[Project1].[StoreId] AS [StoreId],
[Project1].[C1] AS [C1],
[Project1].[StoreId1] AS [StoreId1]
FROM (SELECT
[Limit1].[StoreId] AS [StoreId],
[Extent2].[StoreId] AS [StoreId1],
CASE WHEN ([Extent2].[StoreId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
FROM (SELECT TOP (1) [c].[StoreId] AS [StoreId]
FROM [dbo].[stores] AS [c]) AS [Limit1]
LEFT OUTER JOIN [dbo].[stores] AS [Extent2] ON [Extent2].[StoreId] > [Limit1].[StoreId]
) AS [Project1]
ORDER BY [Project1].[StoreId] ASC, [Project1].[C1] ASC
Ancak, Varlık Çerçeve tüm mağazaları tabloyu çeker "Sabit oluşturulamıyor" hatası ile başarısız önce, belleğe.
LINQKit'i ExpandableQuery
paketini açmaya zorlamak ve iç içe geçmiş alt sorguları ifade ayrıştırıcısı içinde değerlendirmek için bilinen bir geçici çözüm var mı?