2013-08-20 18 views
12

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ı?

cevap

0

Kullanabileceğiniz tek şey, .AsEnumerable. Bu, hatanın nereden geldiğini doğrudan SQL'e çevirmeyi engeller.

, Ana aşağıdaki deneyin:

var table = (IQueryable<Store>)context.Set<Store>(); 
var q = table 
    .AsEnumerable() 
    .Select(t => new {Id = t.StoreId, less = table.Where(tt => tt.StoreId > t.StoreId) }) 
    .Take(1) 
    .ToArray(); 
0

Bu Linqkit ilişkili değildir. Yalnızca ilkel değere izin verilen bir nesneyi kullandığınızda her zaman aldığınız bir EF istisnasıdır.

tt'un Store nesnesi olduğunu düşünüyorum. Bu nesne SQL'e dönüştürülemiyor. Bu yüzden ilk önce tt.StoreId kimliğini bir değişkene koyun ve değişkenleri sorguda kullanın.

İlgili konular