2

我有以下查询来使用 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 急切加载查询而不使用那些丑陋的方法来实现我想要的?

4

3 回答 3

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();
于 2013-12-09T11:48:11.793 回答
0

不确定我的 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:即兴界面

于 2013-12-11T06:10:10.817 回答
0

您仍然必须手动创建和维护您的 POCO ProcuctLineItem,并且您知道某处必须生成一些 SQL,这可能是最佳的,也可能不是最佳的。使用真正的 SQL,然后让QueryFirst生成 ADO 内容,您会不会更快乐、更放松?

于 2016-07-27T09:54:25.740 回答