簡體   English   中英

將Simple.Data.Query轉換為POCO對象

[英]Casting Simple.Data.Query to POCO Object

我有以下查詢,使用Simple.Data.SqlServer中的Join語句從數據庫中讀取記錄。

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渴望加載查詢實現我想要的?

我不確定您理想中的願望是否可行,但是您可以使用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();

不確定我是否正確設置了Q ...但是... Get返回一個序列的元素,因此您無法在其中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代碼似乎正常運行。

不確定丑陋的方法意味着什么,對我來說看起來很漂亮:)

關於演員表(如果您不喜歡第一個查詢),

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

您仍然必須手動創建和維護POCO ProcuctLineItem,並且您知道某些地方必須生成一些SQL,這可能是最佳的,也可能不是最佳的。 使用真正的SQL,您會不會更快樂,更輕松,然后讓QueryFirst生成ADO內容?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM