gpt4 book ai didi

c# - 首先使用 Entity Framework 数据库从 SQL 查询 Xml

转载 作者:数据小太阳 更新时间:2023-10-29 02:02:06 26 4
gpt4 key购买 nike

我需要使用 Entity Framework、LINQ 从我的 asp.net mvc(C#) 应用程序中的 SQL 查询 XML 数据。

我有一个包含数据的 XMLValue

<MetaData>
<Reviews>1</Reviews>
<Rating>1</Rating>
</MetaData>

我需要从 xml 中获取所有 Rating 为 1 的 Customers。我提到了this stackoverflow post我无法实现它。

我已经添加了 SQL 函数并将其添加到我的 edmx 中:

CREATE FUNCTION [dbo].[FilterCustomersByRating] 
(@Rating int)
RETURNS TABLE
AS
RETURN
SELECT XMLTest.*
FROM XMLTest
CROSS APPLY XMLValue.nodes('//MetaData') N(C)
where N.C.value('Rating[1]', 'int')=@Rating
GO

以及以下数据库函数:

[DbFunction("XMLDBModel.Store", "FilterCustomersByRating")]
public static IQueryable<XMLTest> MyXmlHelper(int rating)
{
throw new NotImplementedException("You can only call this function in a LINQ query");
}

下面是我在帖子中完全尝试过的 linq 查询,但无法使用该函数并抛出错误。

 var _dbCustomers = (from x in _context.XMLTests
where MyXmlHelper(1).Where(xh=> xh.XMLValue.Contains("1"))
select x);

错误:

Cannot implicitly convert type 'System.Linq.IQueryable<XMLTest>' to 'bool

如果我使用 Any(),我会出现以下错误:

 var _dbCustomers = (from x in _context.XMLTests
where MyXmlHelper(1).Any(xh => xh.XMLValue.Contains("1"))
select x);

错误:

The specified method 'System.Linq.IQueryable`1[XMLTest] MyXmlHelper(Int32)' on the type 'CustomerRepository' cannot be translated into a LINQ to Entities store expression because its return type does not match the return type of the function specified by its DbFunction attribute.

有人可以建议如何实现这一点吗?

最佳答案

我认为问题是由 stub 函数的返回类型引起的。

你能检查一下你的 FilterCustomersByRating 的返回类型吗?方法在您的 DbContext 中?我认为不应该是 XMLTest .它应该类似于下面的代码:

[EdmFunction("TestingDbEntities", "FilterCustomersByRating")]
public virtual IQueryable<FilterCustomersByRating_Result> FilterCustomersByRating(Nullable<int> rating)
{
var ratingParameter = rating.HasValue ?
new ObjectParameter("Rating", rating) :
new ObjectParameter("Rating", typeof(int));

return ((IObjectContextAdapter)this)
.ObjectContext
.CreateQuery<FilterCustomersByRating_Result>("[TestingEntities]
.[FilterCustomersByRating](@Rating)", ratingParameter);
}

在这种情况下, stub 函数的返回类型将是 FilterCustomersByRating_Result 类型这是在您添加 FilterCustomersByRating 时自动生成的类您的 edmx 文件的表值函数。

CREATE FUNCTION [dbo].[FilterCustomersByRating] 
(@Rating int)
RETURNS TABLE
AS
RETURN
SELECT XMLTest.*
FROM XMLTest
CROSS APPLY XMLValue.nodes('//MetaData') N(C)
where N.C.value('Rating[1]', 'int')=@Rating
GO

考虑到这一点,您的 stub 函数应该返回 IQueryable<FilterCustomersByRating_Result>

[EdmFunction("TestingDbEntities", "FilterCustomersByRating")]
public static IQueryable<FilterCustomersByRating_Result> MyXmlHelper(int rating)
{
throw new NotImplementedException("You can only call this function in a LINQ query");
}

您可以如下所示使用它:

var dbCustomers = (from x in _context.XMLTests
where MyXmlHelper(1).Any(xh => xh.XMLValue.Contains("1"))
select x);

请注意,虽然这会起作用,但它会返回所有 Customers .您可能需要修改 FilterCustomersByRating接受 CustomerID 的函数和 rating .

试一试。

编辑

除上述之外,在定义 MyXmlHelperEdmFunction , 确保 FunctionName 的拼写和 NamespaceName是正确的。在我的例子中,FunctionNameFilterCustomersByRatingNamespaceNameTestingEntities匹配自动生成的 DBContext 类中的值。

// </auto-generated code>
public partial class TestingEntities : DbContext
{
public TestingEntities()
: base("name=TestingEntities")
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}

public DbSet<XMLTest> XMLTests { get; set; }

[EdmFunction("TestingEntities", "FilterCustomersByRating")]
public virtual IQueryable<FilterCustomersByRating_Result> FilterCustomersByRating(Nullable<int> rating)
{
var ratingParameter = rating.HasValue ?
new ObjectParameter("Rating", rating) :
new ObjectParameter("Rating", typeof(int));

return ((IObjectContextAdapter)this)
.ObjectContext
.CreateQuery<FilterCustomersByRating_Result>("[TestingEntities]
.[FilterCustomersByRating](@Rating)", ratingParameter);
}
}

关于c# - 首先使用 Entity Framework 数据库从 SQL 查询 Xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24218403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com