In This Topic
Methods
You can generate SQL statements with the help of methods that are support <IQueryable> interface.
Select, Where, OrderBy, GroupBy, Join – these methods are translated
to SQL naturally as SELECT, WHERE, GROUP BY, ORDER BY and JOIN clauses accordingly.
The query below retrieves all companies from USA that have orders latest than 1998 year. The results of query are ordered by OrderId.
CrmDemoContext.CrmDemoDataContext db = new CrmDemoContext.CrmDemoDataContext();
var query = db.Companies.Where(c => c.Country == "USA")
.Join(db.Orders.Where(o => o.OrderDate >= new DateTime(1998, 1, 1)),
c => c.CompanyID,
o => o.Company.CompanyID,
(c, o) => new
{
c.CompanyName,
o.OrderID,
o.OrderDate
}).OrderBy(p => p.OrderID).Select(p => p);
Dim db As New CrmDemoContext.CrmDemoDataContext()
Dim query = db.Companies.Where(Function(c) c.CompanyName = "USA") _
.Join(db.Orders.Where(Function(o) o.OrderDate >= new DateTime(1998, 1, 1)), _
Function(c) c.CompanyID, _
Function(o) o.Company.CompanyID, _
Function(c, o) New With { _
.CompanyName = c.CompanyName, _
.OrderID = o.OrderID, _
.OrderDate = o.OrderDate _
}).OrderBy(Function(p) p.OrderID).Select(Function(p) p)
Generated SQL
SELECT t1."CompanyName", t2."OrderID", t2."OrderDate"
FROM "Company" t1
INNER JOIN ("Orders" t2
LEFT OUTER JOIN "Company" t3 ON t2."CompanyID" = t3."CompanyID") ON t1."CompanyID" = t3."CompanyID"
WHERE (t1."Country" = :p0) AND (t2."OrderDate" >= :p1)
ORDER BY t2."OrderID"
Parameter Info
Parameter Name |
DbType |
Value |
p0 |
String |
USA |
p1 |
DateTime |
01.01.1998 0:00:00 |
Query
and ExecuteQuery
methods allow you to execute
the SQL code directly. The main difference between them
is that the Query method returns an object that implements
the IQueryable<T> interface
and the ExecuteQuery returns an IEnumerable<T>.
It is means that you can enhance results of the Query execution.
The ExecuteCommand method
does not return any resultset, however it allows to execute any SQL
command directly, without any translation.
The query below returns company list ordered by CompanyName.
CrmDemoContext.CrmDemoDataContext db = new CrmDemoContext.CrmDemoDataContext();
var query = db.Query("SELECT * FROM \"Company\"").OrderBy(c=>c.CompanyName);
Dim db As New CrmDemoContext.CrmDemoDataContext()
db.Query(Of Company)("SELECT * FROM ""Company""").OrderBy(Function(c) c.CompanyName)
Generated SQL
SELECT t1."CompanyID", t1."CompanyName", t1."PrimaryContact", t1."Web", t1."Email",
t1."AddressTitle", t1."Address", t1."City", t1."Region", t1."PostalCode",
t1."Country", t1."Phone", t1."Fax"
FROM (
SELECT * FROM "Company"
) t1
ORDER BY t1."CompanyName"
The SqlMethods class
provides access for a set of the native SQL functions, among them are Like,
Coalesce, Between and so on.
The Contains method is close to the SQL Methods. It is translated to the IN method usually.
Here is a simple example of this method. We get all products that belong to the "novel" and "poem" categories:
CrmDemoContext.CrmDemoDataContext db = new CrmDemoContext.CrmDemoDataContext();
List<string> list = new List<string>(){"novel", "poem"};
var query = from cat in db.ProductCategories
where list.Contains(cat.CategoryName)
select cat;
Dim db As New CrmDemoContext.CrmDemoDataContext()
Dim list As New List(Of String)
list.Add(<novel>)
list.Add(<poem>)
Dim query = From cat In db.ProductCategories _
Where list.Contains(cat.CategoryName) _
Select cat
Generated SQL
SELECT t1."CategoryID", t1."CategoryName", t1."ParentCategory"
FROM db."Product Categories" t1
WHERE t1."CategoryName" IN (:p0,:p1)
Parameter Info
Parameter Name |
DbType |
Value |
p0 |
String |
novel |
p1 |
String |
poem |
The couple of methods from the
DataLoadOptions class
allows you to use LazyLoading
The LoadWith
method is created for loading child entities with the parent one.
The SQL is generated using JOIN for performance reasons. In case, there are several levels of
nested LoadWith calls the JOIN will be used only for the first-level queries because the
performance will suffer greatly in other case.
One of the benefits of Devart LINQ to SQL implementation
is that unlike Microsoft DataLoadOptions class, Devart code allows to call
LoadWith on the separate query level (not only on the Context level).
The AssociateWith method,
unlike the previous one, restricts the child collection. It allows to set a condition
and one will obtain only the entities that satisfy this condition when quering the child collection.
Of course, you can combine these methods successfully.
Here is a simple example where we get all products name of what is started from "A":
CrmDemoContext.CrmDemoDataContext db = new CrmDemoContext.CrmDemoDataContext();
var query = from product in
db.Products.LoadWith(p => p.ProductCategory).Where(p => p.ProductName.StartsWith("A"))
select new
{
Name = product.ProductName,
Price = product.Price,
Category = product.ProductCategory.CategoryName
};
Dim db As New CrmDemoContext.CrmDemoDataContext()
Dim query = From prod In _
db.Products.LoadWith(Function(p) p.ProductCategory).Where(Function(p) p.ProductName.StartsWith("A")) _
Select New With{ _
.Name = prod.ProductName, _
.Price = prod.Price, _
.Category = prod.ProductCategory.CategoryName}
Generated SQL
SELECT t1."ProductName", t1."Price", t2."CategoryName"
FROM "Products" t1
LEFT OUTER JOIN db."Product Categories" t2 ON t1."CategoryID" = t2."CategoryID"
WHERE t1."ProductName" LIKE :p0
The SQL above is generated for Oracle database.
Parameter Info
Parameter Name |
DbType |
Value |
p0 |
String |
A% |
These examples illustrate usage of LoadWith and AssociateWith methods. Here we receive all products that belong to the "poem" category.
CrmDemoContext.CrmDemoDataContext db = new CrmDemoContext.CrmDemoDataContext();
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<ProductCategory>(pc => pc.Products);
dlo.AssociateWith<ProductCategory>(pc => pc.Products.Where(p=>p.Price > 10 ));
db.LoadOptions = dlo;
var query = (from cat in db.ProductCategories
where cat.CategoryName == "poem"
select cat).SingleOrDefault();
Dim db As New CrmDemoContext.CrmDemoDataContext()
Dim dlo As New DataLoadOptions
dlo.LoadWith(Of ProductCategory)(Function(pc As ProductCategory) _
pc.Products)
dlo.AssociateWith(Of ProductCategory)(Function(pc As ProductCategory) _
pc.Products.Where(Function(p As Product) p.Price > 10))
db.LoadOptions = dlo
Dim query = (From cat In db.ProductCategories _
Where cat.Categoryname = "poem" _
Select cat).SingleOrDefault()
Generated SQL
SELECT t1."CategoryID", t1."CategoryName", t1."ParentCategory", t3."ProductID", t3."ProductName",
t3."CategoryID" AS "CategoryID1", t3."UnitName", t3."UnitScale", t3."InStock", t3."Price",
t3."DiscontinuedPrice", t3."Discontinued"
FROM (
SELECT t2."CategoryID", t2."CategoryName", t2."ParentCategory"
FROM "Product Categories" t2
WHERE t2."CategoryName" = :p0
) t1
LEFT OUTER JOIN "Products" t3 ON (t1."CategoryID" = t3."CategoryID") AND (t3."Price" > :p1)
ORDER BY t1."CategoryID"
The SQL above is generated for Oracle database.
Parameter Info
Parameter Name |
DbType |
Value |
p0 |
String |
poem |
p1 |
Double |
10 |