2013-12-09 70 views
2

我有以下查詢使用Simple.Data.SqlServer中的Join語句從數據庫中讀取記錄。Casting Simple.Data.Query到POCO對象

var productLineItem = (ProductLineItem) (database.Products.All() 
          .Select(
           database.Products.Name, 
           database.Products.Price 
          ) 
         .Join(database.BarCodes) 
         .On(database.BarCodes.ProductID == database.Products.ID) 
         .Where(database.BarCodes.BarCode == barCode).FirstOrDefault()) 

請注意,我必須使用FirstOrDefault方法以及將整個語句包裝到括號中,然後將其轉換爲對象。我不喜歡這種方式。我認爲Simple.Data應該能像下面的代碼

ProductLineItemproductLineItem = database.Products.Get() 
          .Select(
           database.Products.Name, 
           database.Products.Price 
          ) 
         .Join(database.BarCodes) 
         .On(database.BarCodes.ProductID == database.Products.ID) 
         .Where(database.BarCodes.BarCode == barCode); 

工作在我使用GET,因爲我知道我會得到只有一條記錄,而不是記錄列表上面的例子,但此查詢不工作。

如何使用Simple.Data預先加載查詢並且不使用那些醜陋的方法來實現我想要的功能?

+1

如果您設法找到答案,請分享。我結束了同一條船。你可以在你的第一個例子中刪除'('around數據庫,我現在使用Dapper的原因是因爲Simple.Data不再被支持,雖然沒有那麼優雅,但它更容易。 –

回答

1

我不知道,如果你想要的理想是可能的,但你可以使用至少繼續在功能性風格的查詢和刪除你不熱衷於括號一個Cast() LINQ的方法:

var productLineItem = database.Products 
    .All() 
    .Select(database.Products.Name, database.Products.Price) 
    .Join(database.BarCodes) 
    .On(database.BarCodes.ProductID == database.Products.ID) 
    .Where(database.BarCodes.BarCode == barCode) 
    .Cast<ProductLineItem>() 
    .FirstOrDefault(); 
+0

我懷疑cast會作爲代碼工作 – qujck

+1

啊,我的不好 - 我讀到的問題意味着第一個代碼示例工作... –

+0

它給了我一個錯誤對象'不包含'FirstOrDefault'的定義 –

0

不知道如果我得到●右鍵...但是... 獲取返回序列的元素,所以你不能Select那裏... 在另一方面:

var database = Database.OpenNamedConnection("MyDbCnxString"); 
var x= 11;     
var y= 1; 
var result= database.Table1.FindAllByX(x) 
         .Select(
          database.Table1.X, 
          database.Table1.Y 
         ) 
        .Join(database.Table2) 
        .On(database.Table2.X== database.Table1.X) 
        .Where(database.Table2.Y== y); 

(result as object).Dump("Voila!"); 

此LinqPad代碼似乎t o工作好吧。

不知道你的意思是醜陋的方法是什麼,它看起來很對我:)

關於投(如果這就是你不喜歡你的第一個查詢),

IEnumerable<IResult> results = (result as SimpleQuery).ActLike<IEnumerable<IResult>>(); 
//DuckTypeTest 
foreach(var r in results) 
    Console.WriteLine("IResult {0}:{1}",r.ClientId,r.ClientSeqNo); 

更冗長,但來自查詢

其中IResult

public interface IResult { 
    object X {get;set;} 
    object Y {get;set;} 
} 
至少遠

哪裏ActLike<IResult>

using ImpromptuInterface; 

GitHub:ImpromptuInterface

0

你仍然需要手工創建和維護你的POCO ProcuctLineItem,你知道的東西,某處將不得不產生一些SQL,可能會或可能不是最佳的。你會不會更快樂,更輕鬆使用真正的SQL,然後讓QueryFirst生成ADO的東西?