C# 将Simple.Data.Query强制转换为POCO对象

C# 将Simple.Data.Query强制转换为POCO对象,c#,simple.data,C#,Simple.data,我使用Simple.Data.SqlServer中的Join语句从数据库中读取以下查询 var productLineItem = (ProductLineItem) (database.Products.All() .Select( database.Products.Name, database.Product

我使用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方法,并将整个语句包装到括号中,然后将其转换为对象。我不喜欢这样。我觉得很简单。数据应该可以像下面的代码一样工作

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 Earting loading query实现我想要的,而不使用那些丑陋的方法?

我不确定您理想的方法是否可行,但有一种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();
var productLineItem=database.Products
.All()
.选择(database.Products.Name、database.Products.Price)
.Join(数据库.条形码)
.On(database.barcode.ProductID==database.Products.ID)
.Where(database.BarCode.BarCode==条形码)
.Cast()
.FirstOrDefault();

不确定我的问题是否正确。。。但是 Get返回序列的一个元素,因此您不能在那里
选择
。。。
另一方面:

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代码似乎工作正常

不知道你用丑陋的方法是什么意思,在我看来它很漂亮
:)

关于演员阵容(如果这是你不喜欢的第一个问题)

其中
ActLike


中,您仍然需要手动创建和维护您的POCO ProcuctLineItem,并且您知道,在某些地方必须生成一些SQL,这些SQL可能是最佳的,也可能不是最佳的。使用真正的SQL,然后让它生成ADO,你会不会更高兴、更轻松?

我怀疑强制转换是否会起作用,因为代码是
select
ing一个匿名类型。它给了我一个错误对象“没有包含“FirstOrDefault”的定义你问题中的第一个代码示例给出了这个错误,或者我的答案中的代码,或者两者都可以?我的第一个代码示例运行良好,理想情况下,我希望代码与我的第二个代码示例类似,而无需将整个查询包装在括号中,也无需使用FirstOrDefaut。您提出的解决方案中出现了错误。正如我所说,我不确定您理想的需求是否可能实现。我的工作假设
其中
FirstOrDefault
都是标准的Linq扩展方法-如果说
FirstOrDefault
不存在,那么我猜这是不正确的。如果你找到了答案,请分享。我最终还是在同一条船上。在您的第一个示例中,您可以删除数据库中的“(”。最近我更多地使用Dapper,因为Simple.Data不再受支持,尽管不再那么优雅,但在某些方面更容易。
IEnumerable<IResult> results = (result as SimpleQuery).ActLike<IEnumerable<IResult>>();
//DuckTypeTest
foreach(var r in results)
    Console.WriteLine("IResult {0}:{1}",r.ClientId,r.ClientSeqNo);
public interface IResult  {
   object X {get;set;}
   object Y {get;set;}
}
using ImpromptuInterface;